package com.it.thread_pool;

import java.util.concurrent.*;

/**
 * 目标：掌握线程池的创建
 */
public class ThreadPoolTest1 {
    public static void main(String[] args) {
        // 1、通过ThreadPoolExecutor创建一个线程池对象
//        public ThreadPoolExecutor(
//                                int corePoolSize, // 指定线程池的核心线程的数量;       如：正式工：3
//                                int maximumPoolSize, // 指定线程池的最大线程数量。     如：最大员工数：5 临时工：2
//                                long keepAliveTime,  // 指定临时线程的存活时间。       如：临时工空闲多久被开除
//                                TimeUnit unit,       // 指定临时线程存活的时间单位（秒、分、时、天）
//                                BlockingQueue<Runnable> workQueue, // 指定线程池的任务队列  如：客人排队的地方
//                                ThreadFactory threadFactory, // 指定线程池的线程工厂  如：负责招聘员工的（hr）
//                                RejectedExecutionHandler handler); // 指定线程池的任务拒绝策略（线程都在忙，任务队列也满了的时候，新任务来了该怎么处理） 如：忙不过来咋办？

       // 线程池对象
        // 多态写法
//        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8,
//                TimeUnit.SECONDS, new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(),
//                new ThreadPoolExecutor.CallerRunsPolicy());

//        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8,
//                TimeUnit.SECONDS, new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(),
//                new ThreadPoolExecutor.DiscardOldestPolicy());

        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());


        Runnable target = new MyRunnable();
        pool.execute(target); // 线程池会自动创建一个新线程，自动处理这个任务，自动执行的！
        pool.execute(target); // 线程池会自动创建一个新线程，自动处理这个任务，自动执行的！
        pool.execute(target); // 线程池会自动创建一个新线程，自动处理这个任务，自动执行的！
        pool.execute(target); // 复用前面的核心线程
        pool.execute(target); // 复用前面的核心线程
        pool.execute(target); // 复用前面的核心线程
        pool.execute(target); // 复用前面的核心线程

        // 到了临时线程的创建时机了
        pool.execute(target);
        pool.execute(target);

        // 到了新任务的拒绝时机
        pool.execute(target);

        pool.shutdown(); // 等着线程池的任务全部执行完毕后，再关闭线程池
//        pool.shutdownNow(); // 立即关闭线程池！不管任务是否执行完毕！

    }
}
